#----------------------------------*-sh-*--------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | www.openfoam.com
#    \\/     M anipulation  |
#------------------------------------------------------------------------------
#     Copyright (C) 2020 OpenCFD Ltd.
#------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
#
# Script
#     have_cmake
#
# Description
#     Locate CMAKE executable
#
# Files
#     Uses etc/config.sh/cmake (if it exists) for the
#     CMAKE_ARCH_PATH that may specify a possible cmake/bin directory.
#
# Functions provided
#     have_cmake, no_cmake, echo_cmake, search_cmake
#
# Variables set on success
#     HAVE_CMAKE
#     CMAKE_EXE
#
# When properly resolved, CMAKE_EXE will be an absolute path to the
# cmake executable. On failure it will point to 'false'
#
#------------------------------------------------------------------------------

# Reset
no_cmake()
{
    unset HAVE_CMAKE CMAKE_EXE CMAKE_ARCH_PATH
}


# Report
echo_cmake()
{
    echo cmake="${CMAKE_EXE:-false}"
    echo version="$("${CMAKE_EXE:-false}" --version | sed -ne '1s/^.*version *//p')"
}


# Search
# $1 : prefix (*_ARCH_PATH, system, ...)
#
# Locate cmake according to values specified in <etc/config.sh/cmake>
# or just use what is found on the path.
#
# On success: return the resolved value as output.
# On failure: set executable as "false" and return with 1
search_cmake()
{
    # Treat previous queries as "sticky"
    if [ -n "$CMAKE_EXE" ]
    then
        test "$CMAKE_EXE" != "false"
        return $?
    fi

    local prefix="$1"
    local candidate foundExe

    candidate="$prefix"/bin/cmake

    if [ -d "$prefix" ] && [ -f "$candidate" ] && [ -x "$candidate" ]
    then
        foundExe="$candidate"
    elif candidate="$(command -v cmake 2>/dev/null)"
    then
        # Resolved from PATH
        foundExe="$candidate"
    fi

    if [ -n "$foundExe" ]
    then
        # OK
        export HAVE_CMAKE=true
        export CMAKE_EXE="$foundExe"
    else
        # Failure
        export CMAKE_EXE="false"  # Avoid repeated calls?
        return 2
    fi
}


# Output as per search_* function
have_cmake()
{
    # Treat previous queries as "sticky"
    if [ -n "$CMAKE_EXE" ]
    then
        test "$CMAKE_EXE" != "false"
        return $?
    fi

    local config="config.sh/cmake"
    local file
    unset CMAKE_ARCH_PATH

    if file="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config" 2>/dev/null)"
    then
        . "$file"
    fi

    search_cmake "$CMAKE_ARCH_PATH"
}


#------------------------------------------------------------------------------

# Reset
no_cmake

# Test/query
case "$1" in
-test)
    have_cmake
    echo_cmake
    ;;
-query)
    ## query_cmake
    ;;
esac

#------------------------------------------------------------------------------
